package com.eric.controller;

import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import com.eric.domain.po.User;
import com.eric.domain.vo.UserVO;
import com.eric.service.UserService;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.update.UpdateChain;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.Objects;

import static com.eric.domain.po.table.UserTableDef.USER;

/**
 *  控制层。
 *
 * @author eric.deng
 * @since 2025-03-05
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {


    private final UserService userService;



    /**
     * 添加。
     *
     * @return {@code true} 添加成功，{@code false} 添加失败
     */

//    逻辑是，先判断userName中的名字是否和数据库中存在，如果有，返回错误，没有，就录入
    @PostMapping("save")
    @Transactional
    public SaResult save(@RequestBody User user) {
        System.out.println(user);
        String loginName = user.getLoginName();
        User one = userService.queryChain().select()
                .from(User.class).
                where(USER.LOGIN_NAME.eq(loginName))
                .one();
        boolean empty = BeanUtil.isEmpty(one);
        if (empty){

//           这里还需要补充一个，对password和username做一个正则表达式校验
            String pw_hash = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
            user.setPassword(pw_hash);
            userService.save(user);
            return SaResult.ok("注册成功！");
        }
        return SaResult.error("用户已存在！");
    }

    /**
     * 根据主键删除。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("remove/{id}")
    @Transactional
    public SaResult remove(@PathVariable Long id) {
        boolean b = userService.removeById(id);
        return SaResult.data(b);
    }

    /**
     * 根据主键更新。
     *
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    @Transactional
    public SaResult update(@RequestBody User user) {

        boolean loginNameEffective=false;
        boolean passwordEffective=false;
        boolean realNameEffective=false;
        boolean descriptionEffective=false;
        if (user.getLoginName()!=null){
            loginNameEffective=true;
        }
        if (user.getPassword()!=null){
            passwordEffective=true;

        }
        if (user.getRealName()!=null){

            realNameEffective=true;
        }
        if (user.getDescription()!=null){
            descriptionEffective=true;
        }

        if (passwordEffective){
            String hasPw=BCrypt.hashpw(user.getPassword(),BCrypt.gensalt());
            user.setPassword(hasPw);
        }

//        通过传进来的user对象中的loginName在数据库查询一个对象
        User one = userService.queryChain().where(USER.LOGIN_NAME.eq(user.getLoginName())).one();
//        如果one的one中的id和user中的id不一致，怎么原来数据库中已经存在一个数据的loginName是一致，不能修改，除非id都一样
        if (Objects.equals(one.getLoginName(), user.getLoginName()) && !Objects.equals(one.getId(), user.getId())){
            return SaResult.error("登录名称已存在！");
        }

        boolean updated = UpdateChain.of(User.class)
                .set(User::getLoginName, user.getLoginName(), loginNameEffective)
                .set(User::getPassword, user.getPassword(), passwordEffective)
                .set(User::getRealName, user.getRealName(), realNameEffective)
                .set(User::getDescription, user.getDescription(), descriptionEffective)
                .where(USER.ID.eq(user.getId()))
                .update();
        return SaResult.data(updated);

    }

    /**
     * 查询所有。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public SaResult getAllUserListByPage(Integer cur,Integer pageSize) {
        return userService.getAllUserListByPageService(cur,pageSize);
    }

    /**
     * 根据主键获取详细信息。
     *
     * @param id 主键
     * @return 详情
     */
    @GetMapping("getInfo/{id}")
    public SaResult getInfo(@PathVariable Long id) {
        return userService.getOneById(id);

    }

    /**
     * 分页查询。
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @GetMapping("page")
    public Page<User> page(Page<User> page) {
        return userService.page(page);
    }

    @GetMapping("/userInfo")
    public SaResult getUserInfoByLoginName(){
        Object loginId = StpUtil.getLoginId();
        Integer anInt = Convert.toInt(loginId)-1000;
        UserVO userVO = userService.queryChain().select()
                .from(User.class).
                where(USER.ID.eq(anInt))
                .oneAs(UserVO.class);
//        userVO.setPassword(null);
        return SaResult.data(userVO);
    }

    @GetMapping("/userCount")
    public SaResult getAllUserCounts(){
        return userService.getAllUserCountsService();
    }

    @GetMapping("/getByName")
    public SaResult getListByName(String name,Integer cur,Integer pageSize){
        return userService.getListByNameService(name,cur,pageSize);
    }

    @GetMapping("/getByNameCount")
    public SaResult getCountByName(String name){
        return userService.getCountByName(name);
    }

    @GetMapping("/getByBetweenTimes")
    public SaResult getUserByBetweenTimes(String startTime,String endTime,Integer cur,Integer pageSize){

        return userService.getUserByBetweenTimesService(startTime,endTime,cur,pageSize);
    }


    @GetMapping("getCountByBetweenTime")
    public SaResult getCountByBetweenTime(String startTime,String endTime){
        return userService.getCountByBetweenTimeService( startTime,endTime);
    }



}
